查看原文
其他

用中值定理求根

Y叔叔 biobabble 2020-02-05

翻看了以前写的使用Newton-Raphson Method求一个数的开方,想到其实也可以用中值定理来实现。

中值定理:f(x)是一个连续性的函数,在[u,v]区间内,当c的值位于f(u)和f(v)之间时,至少存在一个点,满足f(x) = c 当f(u)和f(v)一正一负时,那么在[u,v]之间至少有一个根的存在,这个定理本来就是拿来证明根的存在的,但是其实也可以用来求解根。

把[u,v]的区间不断地缩小,就可以不断地逼近根的值,这不是人干的,但是适合计算机干,理论上,进行无穷次之后,便是根的准确值。当然不可能写个死循环,给定一个精度,当求解的根与实际值相差在精度范围内便退出循环,返回结果。

随手写了一段,可以拿来求根,就可以设计函数来求解无理数的有理数近似值,可以求解函数值等于某一值的x值,可以求解两个函数的交点等等。

bisect <- function(f, u, v, eps){    
   if ( f(u) * f(v) > 0)        
        stop (" error, select another value for u or v...")
    if ( f(u) < 0) {         u1 <- u         v1 <- v     } else {         u1 <- v         v1 <- u     }     cnt <- 1     step <- log2(abs(u1-v1)/eps)
    while ( cnt < step ){         m <- (u1+v1)/2         if ( f(m) == 0)
             break         if ( f(m) < 0 ) {             u1 <- m         } else {             v1 <- m         }         cnt <- cnt + 1     }     return (m) }


往期精彩

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存